Перейти к основному содержимому
Версия: 1.0

Конфигурирование агента

Формат конфигурационного файла​

Для настройки логики работы Solar TI Feeds необходимо внести изменения в конфигурационный файл. Путь к этому файлу необходимо указать при запуске агента. При поставке агента готовым дистрибутивом путь до конфига прописан в файле docker-compose.yml в виде volume.

Конфигурационный файл агента представлен в формате pkl. Благодаря использованию данного языка в агенте есть возможность создавать динамические конфигурации, наполняя конфигурационный файл логикой, присущей языкам программирования, а также есть возможность описывать структуру конфига, наследовать элементы и валидировать значения.

О языке PKL​

PKL — это язык программирования для создания динамических конфигураций. Он сочетает простоту декларативных форматов с безопасностью и выразительностью статической типизации.

Рекомендация: Перед работой ознакомьтесь с официальной документацией PKL и установите расширение для своей IDE для подсветки синтаксиса.

Структура конфигурации​

Набор файлов для настройки агента включает:

  1. agent.pkl – базовый файл конфигурации с описанием структур и возможных значений параметров, который предоставляется вместе с образом агента для того, чтобы у клиентов была возможность на его основе изменять основную конфигурацию, а также для корректной работы IDE со структурами агента.
  2. Основной конфигурационный файл в формате pkl – файл, который описывает логику работы и параметры запуска агента на основе определенных в базовом файле структур. Далее будет рассматриваться только основной конфигурационный файл, так как базовый тесно связан с кодом агента и не подлежит изменению.
  3. templates.pkl – файл с шаблонами конфигурации.

Структура основного файла​

// 1. Блок импортов и наследования
import "agent.pkl"

// 2. Локальные переменные (опционально)
local myVariable = "value"

// 3. Секция pipelines - описание цепочек обработки данных
pipelines {
new Components.Pipeline { ... }
}

// 4. Секция settings - общие настройки агента
settings { ... }

Основная логика конфигурации — создание одной или нескольких цепочек (pipeline) обработки данных. Каждая цепочка состоит из компонентов, связанных между собой: начинается с input (источник данных), может включать transform (преобразования) и заканчивается sink (выходной приемник).

Секция Pipelines​

В блоке pipelines объявляется listing (объект в pkl, список, по форме объявления напоминающий объект) pipeline, где можно указывать любое количество отдельных пайплайнов, каждый из которых состоит из компонент агента, описанных выше, представленных следующими блоками:

ПараметрТипОбязательностьОписание
nameStringДаУникальное имя пайплайна.
inputsListingДаСписок компонентов-источников данных (генераторов).
transformsListingНетСписок компонентов-преобразователей (фильтры, мапперы).
sinksListingДаСписок компонентов-приемников данных (выходные ноды).

Каждый компонент в пайплайне (input, transform, sink) содержит общий набор параметров:

ПараметрТип данныхОбязательностьОписаниеПример
nameStringДаУникальное имя объекта компонента, задается пользователемexample-name
InputsListingДа, кроме inputПеречисление имен других компонент, которые будут являться источником данных для текущего элементаinputs{“ example-name”}
sourceNameStringНетИмя исходника используемого компонента, по умолчанию определяется на основе класса компонента, требуется указывать только при создании нового компонентаsourceName = "indicator_generator"
outputBufferSizeUIntНетБуфер сообщений для общения между компонентамиoutputBufferSize = 5
threadsUIntНетКоличество потоков, по умолчанию = 1threads = 5

Пример объявления структуры пайплайна без дополнительных параметров компонент:

pipelines {
new Components.Pipeline{
name = "example-pipeline"
inputs {
new agent.FeedsGenerator{
name = "example-generator"
}
}
transforms {
new agent.IndicatorsTextMap{
name = "example-map"
inputs {
"example-generator"
}
}
}
sinks {
new agent.IndicatorsTextSink{
name = "example-sink"
inputs {
"example-map"
}
}
}
}
}

Секция Settings​

Блок settings содержит общие настройки работы агента, не связанные напрямую с логикой пайплайнов.
Параметры блока Settings:

ПараметрТип данныхОбязательностьОписаниеПример
loggerLoggerConfigДаПараметры логированияlogger { logLevel = "info" logFormat = "json" enableConsole = true fileParams { directory = outputDir name = "agent.log" }}
healthCheckHelthcheckConfigНетПараметры сервера доступностиhealthCheck { host = "localhost" port = 82}|
metricsMetricsConfigНетПараметры сервера метрикmetrics {serviceName = "agent"}
gracefulShutdownDelayDurationНетТаймаут обработки данных при завершении работы агента, значение по умолчанию 15.s600.s

Пример блока настроек:

settings {
gracefulShutdownDelay = 600.s
logger {
logLevel = "info"
logFormat = "json"
enableConsole = true
fileParams {
directory = logDir
name = "agent.log"
}
}
healthCheck {
}
metrics {
serviceName = "agent"
}
}

Детальная конфигурация Logger​

Параметры конфигурации настроек логирования LoggerConfig:

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
logLevelStringinfoНетУровень логирования, возможные значения: error, warn, info, debug, tracedebug
enableConsoleBooleanTrueНетВывод логов в консольfalse
logFormatStringJsonНетФормат логов, возможные значения: plain, jsonplain
fileParamsWriteFileParamsНетНастройки записи лога в файлfileParams { directory = outputDir name = "agent.log"}

Параметры конфигурации настроек записи лога в файл WriteFileParams:

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписание
directoryStringНетДиректория для записи логов
nameStringНетИмя файла лога
maxSizeDataSize100.mbНетМаксимальный размер файла лога для ротации
maxBackupsInt5НетМаксимальное количество файлов лога
maxAgeInt7НетСрок жизни лога в днях

Детальная конфигурация HealthCheck​

Параметры конфигурации сервера проверки доступности HealthCheck:

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
hostStringнетАдрес локального сервераlocalhost
portUInt82НетПорт локального сервера8082

Детальная конфигурация Metrics​

Параметры конфигурации сервера отдачи метрик MetricsConfig:

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
hostStringНетАдрес локального сервераlocalhost
portUInt8090НетПорт локального сервера8082
pathString/metricsНетПуть метрик на сервере/api/metrics
serviceNameStringНетИмя сервисаsolar-agent

Параметры конфигурации встроенных объектов конфигураций агента​

Конфигурации компонент пайплайнов​

Параметры конфигурации ServerCfg​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписание
apiTokenStringДаJWT токен доступа к API
apiServerAddrStringДаАдрес сервера API TI Feeds на получение фидов
notificationServerAddrStringНетАдрес сервера API TI Feeds на получение уведомлений по фидам
telemetryServerAddrStringНетАдрес сервера API TI Feeds на отправку телеметрии
insecureSkipVerifyBooleanfalseНетОтключение проверки SSL-сертификата сервера

Параметры конфигурации ScheduleCfg​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
useEventsBooleanfalseНетЗапуск агента по получению событий от сервера
useCronBooleanfalseНетЗапуск агента по cron
runOnStartBooleantrueНетЗапуск агента при первом запуске вне зависимости от cron
crontabStringНетCrontab периодичности запуска агента"*/1 * * * *"

Параметры конфигурации SQLiteCfg​

ПараметрТип данныхОбязательностьОписание
sqliteDbFileStringДаПуть до файла БД, в который сохраняется состояние работы агента

Параметры конфигурации IterParams​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
direction_sortStringASCНетПорядок сортировки и итерации фидов, возможные значения: ASC, DESCDESC
limitInt1000НетОграничение количества индикаторов в ответе на запрос, максимум 1000010000

Параметры конфигурации IndicatorRequestParams​

ПараметрТип данныхОбязательностьОписаниеПример
feedNamesListНетСписок запрашиваемых фидовList("TOR","VPN","PHISHING","C2","APT","MALWARE")
typesListНетСписок типов запрашиваемых индикаторов, возможные значения: "domain-name", "ipv4-addr", "ipv6-addr", "socketv4", "url", "md5-hash", "sha1-hash", "sha256-hash"List("ipv4-addr", "ipv6-addr", "socketv4", "domain-name", "url")
actionsListНетСписок запрашиваемых action, возможные значения: "create", "update", "delete"List("create", "update", "delete")
fieldsListНетСписок запрашиваемых полей индикаторов, возможные значения: "indicator_id", "indicator_type", "action", "value", "description", "first_seen", "last_seen", "valid_until", "external_references", "rules", "categories", "sources", "relations", "feeds", "zone"List("value”, "zone")
IterIterParamsНетПараметры итерацииiter {limit = 1000}

Параметры конфигурации DomainsCategoriesRequestParams​

ПараметрТип данныхОбязательностьОписаниеПример
IterIterParamsНетПараметры итерацииiter {limit = 1000}

Параметры конфигурации FileWriterConfig​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписание
outputDirectorySrtingДаДиректория для записи
outputFileNameSrtingДаИмя файла
writeModeSrtingДаРежим записи, возможные значения: append, replace, rolling
fileFormatSrtingДаФормат файла, возможные значения: txt, csv
writeHeadersBooleanTrueНетЗаписывать ли заголовки в CSV файл
separatorSrting,НетРазделитель в CSV
quoteSrting”НетСимвол кавычки в CSV
allQuotesBooleanFalseНетПринудительное экранирование всех ячеек CSV

Параметры конфигурации для Generator​

Генераторы агента — это входные компоненты пайплайна (типа input), отвечающие за получение данных от сервера TI Feeds и имеющие следующие ключевые функции:

  • Выполняют запросы к внешним источникам данных.
  • Регулируют периодичность и время запуска.
  • Сохраняют и используют состояние между запусками (опционально).

Состояние генератора
Каждый генератор отслеживает своё состояние, которое включает:

  • UUID — уникальный идентификатор
  • Имя генератора
  • Тип обрабатываемого индикатора
  • Режим работы (cron по расписанию или event по событию)

Состояние хранится в базе данных SQLite. Для доступа к состоянию необходимо указать путь к БД через параметр sqlite.

Конфигурация
Все генераторы наследуют базовые параметры конфигурации из общей структуры AgentGenerator.

В таблице описаны параметры конфигурации для AgentGenerator:

ПараметрТип данныхОписаниеПример
serverServerCfg

Конфигурация подключения к серверу TI Feeds. Базовый адрес (указывается без https/http)

server = new agent.ServerCfg {
apiToken = read("env:TIC_AGENT_API_TOKEN")
apiServerAddr = read("env:TIC_AGENT_API_SERVER")
insecureSkipVerify = true
}
scheduleScheduleCfgКонфигурация режимов запуска генератора
schedule = new agent.ScheduleCfg {
useCron = true
runOnStart = true
crontab = "*/5 * * * *"
}
sqliteSQLiteCfgКонфигурация базы SQLite
sqlite = new agent.SQLiteCfg {
sqliteDbFile = read("env:TIC_AGENT_SQLITE_DB_FILE")
}

Параметры конфигурации для AgentIndicatorsGenerator​

Базовая надстройка для генераторов, специализирующихся на получении индикаторов. К общим параметрам настройки режимов работы генератора и адресов сервера TI добавляются параметры для точной настройки необходимых данных при запросе индикаторов.

ПараметрТип данныхОписаниеПример
filterIndicatorsRequestParamsПараметры запросов индикаторов
filter = new agent.IndicatorRequestParams {
types = List("ipv4-addr", "ipv6-addr", "socketv4"
"domain-name", "url")
feedNames = feedsList
actions = List("create", "update", "delete")
fields = List("indicator_id", "value",
"indicator_type", "valid_until",
"first_seen", "action",
"external_references", "categories",
"last_seen", "relations",
"description", "rules",
"feeds", "zone")
iter {
limit = 1000
}
}
processTimeoutDurationВремя ожидания обработки индикаторов агентом, для синхронизации между sink и generator при записи в файл10.s

IndicatorsGenerator​

Конечная реализация генератора для получения индикаторов из эндпоинтов /indicators/{indicatorType}. Используется конфигурация AgentIndicatorsGenerator.
Параметр types определяет выбор эндпоинта для запроса, при указании нескольких типов индикаторов выполняется соответствующее количество запросов к каждому из них, включая постраничную итерацию. Параметр feedNames не используется. Имя компонента для объявления в пайплайне:
sourceName = “indicator_generator”

FeedsStreamGenerator​

Конечная реализация генератора для получения индикаторов конкретного фида из эндпоинтов /feeds/{feedName}.
Используется конфигурация AgentIndicatorsGenerator.
Параметр types определяет выбор типов индикаторов в параметрах запросов.
Параметр feedNames определяет выбор эндпоинта feedName для запроса, при указании нескольких фидов выполняется соответствующее количество запросов к каждому из них, включая постраничную итерацию.
Позволяет выгрузить несколько независимых наборов фидов, в связи с этим возможны дубликаты индикаторов при пересечении выгружаемых множеств. Имя компонента для объявления в пайплайне:
sourceName = “feed_stream_generator”

FeedsGenerator​

Конечная реализация генератора для получения индикаторов конкретного фида из эндпоинта /feeds.
Используется конфигурация AgentIndicatorsGenerator.
Параметр types определяет выбор типов индикаторов в параметрах запросов.
Параметр feedNames определяет выбор перечень имен фидов для запроса, при указании нескольких фидов выполняется один запрос со всеми указанными параметрами фидов. включая постраничную итерацию.
Позволяет работать с древовидным представлением фидов. Имя компонента для объявления в пайплайне:
sourceName = “feed_generator”

Параметры конфигурации для DomainCategoriesGenerator​

Генератор, специализирующихся на получении категорий доменов.
К общим параметрам настройки режимов работы генератора и адресов сервера TI добавляются параметры для точной настройки необходимых данных при запросе категорий доменов.
Параметры конфигурации для DomainCategoriesGenerator:

ПараметрТип данныхОписаниеПример
filterDomainCategoriesRequestParamsПараметры запроса категорий доменов
filter {
iter {
limit = 1000
}
}

Параметры конфигурации для Map​

Параметры конфигурации для AgentFilter​

Компонент имеет один единственный параметр code, в котором описывается условие фильтрации на основе структуры объекта данных.

Параметры конфигурации для AgentFilter:

ПараметрТип данныхОписаниеПример
codeStringУсловие фильтрации на основе полученных полей индикатора. Список полей индикатора аналогичен конфигурации Mapjson code = ''' Zone == \\\”BLACK\\\” '''

IndicatorsFilter​

Конечная реализация фильтра для индикаторов. Используется конфигурация AgentFilter. Имя компонента для объявления в пайплайне:
sourceName = “indicators_filter”

DomainCategoriesFilter​

Конечная реализация фильтра для категорий доменов. Используется конфигурация AgentFilter. Имя компонента для объявления в пайплайне:
sourceName = “domain_categories_filter”

Параметры конфигурации для AgentTextMap​

Компонент имеет один единственный параметр fields_map, в котором описывается маппинг структуры индикатора на столбцы CSV / TXT файла.
Для преобразования данных используется язык запросов expr-lang.
Параметры конфигурации для AgentTextMap:

ПараметрОписаниеПример
fieldsMapМаппинг полученных полей объекта на выходные данные в CSV / TXT файле. Промежуточные результаты сохраняются в json, в котором в качестве ключа выступает название желаемого столбца данных, а в качестве значения - выражение на expr для преобразования исходного значения. Список свойств для обработки в expr указан ниже для конкретной реализацииjson fieldsMap = """\{"value": "Value"\} \"""

IndicatorsTextMap​

Конечная реализация map для индикаторов. Используется конфигурация AgentTextMap. Имя компонента для объявления в пайплайне:
sourceName = “indicators_text_map”

Параметры индикатора в рамках expr​

Список возможных свойств индикатора в выражениях из expr:

Свойство индикатораТип данныхЗначение
IndicatorIDstringUUID
IndicatorTypestringipv4-addr, ipv6-addr, socketv4, domain-name, url
ActionstringCREATE, UPDATE, DELETE
UpdatedAtuint64unix timestamp with microseconds, время модификации индикатора
ValuestringЗначение индикатора
DescriptionstringОписание
FirstSeenuint64unix timestamp with microseconds
LastSeenuint64unix timestamp with microseconds
ValidUntiluint64unix timestamp with microseconds
Relations.ObjectIDstringstix-like uuid
Relations.ObjectTypestringТип объекта связи: indicator, report, malware, threat-actor, tool
Relations.IndicatorTypestringТип индикатора, если object_type - indicator: ipv4-addr, ipv6-addr, socketv4, domain-name, url
Relations.ObjectValuestringЗначение объекта связи
ExternalReferences[]stringСсылки на внешние источники
Rules[]stringСработавшие детектирующие правила
Categories[]stringКатегории индикатора
ZonestringЗона индикатора

DomainCategoriesTextMap​

Конечная реализация map для категорий доменов. Используется конфигурация AgentTextMap. Имя компонента для объявления в пайплайне:
sourceName = “domain_categories_text_map”

Параметры категории доменов в рамках expr​

Список возможных свойств индикатора в выражениях из expr:

СвойствоТип данныхЗначение
FQDNstringЗначение домена
OriginalFQDNstringОригинальное значение домена
Categoriesstring

Массив категорий вида:

  • ID – id категории
  • Name – имя категории
  • Description – описание категории
  • GroupName – имя группы
  • GroupID – id группы
UpdatedAtuint64unix timestamp with microseconds, время модификации
LastCategorizedAtuint64unix timestamp with microseconds, время последней категоризации

Дополнительные функции expr​

Также набор функции expr-lang расширен следующим набором функций:

  • timeFromUnixMicro (timeVal uint64) → time - преобразование unix timestamp в формат time.
  • floatToInt(value float32) → int - преобразование числа с плавающей точкой в целочисленный формат.
  • formatUnixTime (timeVal uint64, layout string) → string - преобразование unix timestamp к требуемому строковому формату отображения. Возможные значения layout:
  • Layout
  • ANSIC
  • UnixDate
  • RubyDate
  • RFC822
  • RFC822Z
  • RFC850
  • RFC1123
  • RFC1123Z
  • RFC3339
  • RFC3339Micro
  • RFC3339Nano
  • Kitchen
  • Stamp
  • StampMilli
  • StampMicro
  • StampNano
  • DateTime
  • DateOnly
  • TimeOnly
csv title="Пример CSV файла после маппинга полей:"
Action,AdditionalInformation,Description,Expiration,FirstSeen,IOCName,IOCType,Status,TI_ReportID,Type,URLlink
new,Categories: LastSeen: 1970-01-01 03:00:00 +0300 MSK,,5024-03-25 14:34:46 +0300 MSK,2024-03-25 14:35:23 +0300 MSK,2001:1838:6000::,ipv6-addr,0.000000,relevant,cert,,feed,

Параметры конфигурации для Sink​

Все sink агента имеют базовую конфигурацию AgentSink.
Параметры конфигурации для AgentSink:

ПараметрТипОписание
sqliteSQLiteCfgКонфигурация базы SQLite

Параметры конфигурации для AgentTextSink​

Базовая конфигурация Sink агента для записи данных в файл. Параметры конфигурации для AgentTextSink:

ПараметрТипОписаниеПример
writerFileWriterCfgКонфигурация формата записи в файл
  writer {
outputDirectory = outputDir
outputFileName = ouptputFileName
writeMode = "rolling"
fileFormat = "csv"
writeHeaders = true
separator = ","
quote = "\""
allQuotes = true
}
pusherServiceConfigКонфигурация сервиса доставки данных во внешнюю систему для интеграции
pusher = new agent.CyberTraceCfg {
address {
host = cyberTraceHost
port = cyberTracePort
insecureSkipVerify = true
scheme = "https"
}
credentials = new agent.Basic {
username = cyberTraceUser
password = cyberTracePassword
}
timeout = 20.s
listName = "4rays_list"
confidence = 80
retention = 518400.min
enableBinaryErrorSearch = true
}

Компонент записывает полученные индикаторы в выходной файл в формате CSV / TXT и имеет 3 режима работы:

  1. replace - каждый раз перезаписывает выходной файл;
  2. append - добавляет полученные индикаторы в существующий файл;
  3. rolling - записывает полученные индикаторы в новый файл с timestamp'ом в названии ({output_file_name}_1725962880.csv).

Поддерживаются 2 формата файлов:

  1. CSV - используется для сохранения индикаторов с соответствующими заголовками;
  2. TXT - используется для сохранения индикаторов.

Cостояния генераторов сохраняются в базу данных SQLite. При использовании generator'a и sink'a в рамках одного пайплайна в обоих компонентах должен совпадать путь до файла SQLite. Также в рамках AgentTextSink есть возможность определить параметры объекта для доставки индикаторов до систем, интеграция с которыми поддерживается агентом. Если параметры не указаны, то доставка индикаторов не осуществляется.

IndicatorsTextSink​

Конечная реализация sink для записи индикаторов в файл. Используется конфигурация AgentTextSink. Имя компонента для объявления в пайплайне:
sourceName = “indicators_text_sink”

DomainsTextSink​

Конечная реализация sink для записи категорий доменов в файл. Используется конфигурация AgentTextSink. Имя компонента для объявления в пайплайне:
sourceName = “domains_text_sink”

Параметры конфигурации для TicKafkaSink​

Компонент записывает полученные данные в указанные топики kafka. Поддерживаются объекты индикаторов, категорий доменов, а также их версии после обработки map.

Параметры конфигурации TicKafkaSink​

ПараметрОписаниеПример
kafkaПараметры Kafka
kafka = new Sinks.Kafka {
name = "placeholder"
inputs { "placeholder"}
common {
brokers {read("env:TIC_AGENT_KAFKA_BROKERS")}
topics {read("env:TIC_AGENT_KAFKA_TOPIC")}
saslAuth {
saslMechanism = read("env:TIC_AGENT_KAFKA_SASL_MECHANISM") as Common.SASLMechanism
saslUsername = read("env:TIC_AGENT_KAFKA_SASL_USERNAME")
saslPassword = read("env:$TIC_AGENT_KAFKA_SASL_PASSWORD$")
}
}
}
keyFieldИмя поля, которое будет использоваться в качестве ключа при записи сообщения в Kafkafqdn

Имя компонента для объявления в пайплайне:
sourceName = “tic_kafka_sink”

Параметры конфигурации для sink Kafka​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
commonCommon.KafkaДаБазовая конфигурация подключения к Kafka
common {
brokers {read("env:TIC_AGENT_KAFKA_BROKERS")}
topics {read("env:TIC_AGENT_KAFKA_TOPIC")}
saslAuth {
saslMechanism = read("env:TIC_AGENT_KAFKA_SASL_MECHANISM") as Common.SASLMechanism
saslUsername = read("env:TIC_AGENT_KAFKA_SASL_USERNAME")
saslPassword = read("env:$TIC_AGENT_KAFKA_SASL_PASSWORD$")
}
}
maxRequestSizeDataSize10.mibНетМаксимальный размер сообщения
lingerMsDuration0.msНетМаксимальный период формирования batch для отправки сообщений
batchNumMessagesInt100000НетРазмер batch в сообщениях

Параметры конфигурации Common.Kafka​

ПараметрТип данныхОбязательностьОписание
saslAuthKafkaAuthДаНастройки аутентификации
brokersListingДаАдрес брокеров kafka
versionStringНетВерсия
topicsListingДаСписок топиков kafka

Параметры конфигурации для аутентификации при подключении к серверу Kafka (KafkaAuth)​

ПараметрТип данныхОбязательностьОписание
saslMechanismStringДаМеханизм SASL, возможные значения: SCRAM-SHA-512, SCRAM-SHA-256
saslUsernameStringДаИмя пользователя
saslPasswordStringДаПароль